from PIL import Image, ImageDraw, ImageFont


def set_watermark(image, text, outfile="result.jpeg", angle=30):
    watermark = Image.new("RGB", image.size)  # 创建一个存放文字水印的新图像，大小与image相同
    FONT = "STKAITI.TTF"  # 设置字体为楷体
    size = 10  # 设置水印字体的初始值为10
    im_font = ImageFont.truetype(FONT, size)  # 创建字体对象
    width, height = im_font.getsize(text)  # 获取字体的宽和高
    text_border = min(watermark.size[0], watermark.size[1])  # 水印的字体大小不能超过图像边界
    while width + height < text_border:
        """不断地增加水印字体的宽和高，但是保证水印的宽高之和小于图像宽高中的较小值"""
        size += 1
        im_font = ImageFont.truetype(FONT, size)
        width, height = im_font.getsize(text)
        text_width = (watermark.size[0] - width) / 2
        text_height = (watermark.size[1] - height) / 2  # 水印的字体坐标设置在图像的中间位置
        drawer = ImageDraw.Draw(watermark, "RGB")  # 创建绘制图像的对象
        drawer.text((text_width, text_height), text, font=im_font, fill="white")  # 绘制水印文字，颜色为白色
        watermark = watermark.rotate(angle)  # 旋转水印图像angle角度
        mask = watermark.convert("L")  # 设置从水印图像转换成色彩模式为L的透明遮罩
        result = Image.composite(watermark, image, mask)  # 将水印图像与原图进行混合
        result.save(outfile, "JPEG")  # 将混合后的图像保存为outfile.jpeg文件


if __name__ == "__main__":
    image = Image.open("绿色麦田.png")
    set_watermark(image, "水印")
